package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ISalaryBillDAO;
import org.jsola.hr.dto.SalaryBillAddDTO;
import org.jsola.hr.dto.SalaryBillUpdateDTO;
import org.jsola.hr.dto.excel.SalaryBillImportDTO;
import org.jsola.hr.entity.SalaryBillDO;
import org.jsola.hr.query.SalaryBillQuery;
import org.jsola.hr.vo.*;
import org.jsola.hr.vo.excel.ParseResultVO;
import org.jsola.user.core.TokenUser;

import java.io.File;
import java.util.List;
import java.util.Map;


/**
 * 工资条
 *
 * @author zhr
 */
public interface ISalaryBillService extends IService<ISalaryBillDAO, SalaryBillDO> {

    /**
     * 新增工资条
     *
     * @param salaryBillAddDTO 新增工资条DTO
     * @param tokenUser        当前用户
     * @return 工资条详情信息
     */
    SalaryBillVO save(SalaryBillAddDTO salaryBillAddDTO, TokenUser tokenUser);

    /**
     * 批量新增工资条
     *
     * @param salaryBillAddDTOList 新增工资条DTO
     * @param tokenUser            当前用户
     * @return 工资条详情信息
     */
    List<SalaryBillVO> batchSave(List<SalaryBillAddDTO> salaryBillAddDTOList, TokenUser tokenUser);

    /**
     * 修改工资条
     *
     * @param salaryBillUpdateDTO 修改工资条DTO
     * @param tokenUser           当前用户
     * @return 更新数量
     */
    int update(SalaryBillUpdateDTO salaryBillUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除工资条，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser     当前用户
     * @param salaryBillIds 工资条id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... salaryBillIds);

    /**
     * 根据工资条id查找
     *
     * @param salaryBillId 工资条id
     * @return 工资条详情信息
     */
    SalaryBillVO selectById(String salaryBillId, TokenUser tokenUser);

    /**
     * 根据工资条id查找
     *
     * @param salaryBillIds 工资条id
     * @param siteId        站点id
     * @return 工资条详情信息
     */
    List<SalaryBillVO> selectByIds(List<String> salaryBillIds, String siteId);

    /**
     * 查询工资条
     *
     * @param salaryBillQuery 查询条件
     * @param siteId          所属站点id
     * @return 工资条列表信息
     */
    List<SalaryBillListVO> select(SalaryBillQuery salaryBillQuery, String siteId);

    /**
     * 查询工资条记录数
     *
     * @param salaryBillQuery 查询条件
     * @param siteId          所属站点id
     * @return 工资条记录数
     */
    int selectCount(SalaryBillQuery salaryBillQuery, String siteId);

    /**
     * 分页查询工资条
     *
     * @param salaryBillQuery 查询条件
     * @param siteId          所属站点id
     * @return 工资条列表信息
     */
    Page<SalaryBillListVO> selectPage(SalaryBillQuery salaryBillQuery, String siteId);


    /**
     * 根据工资条id查找
     *
     * @param salaryBillId 工资条id
     * @param siteId       所属站点id
     * @return 工资条
     */
    SalaryBillDO selectDOById(String salaryBillId, String siteId);

    /**
     * 查询工资条
     *
     * @param salaryBillQuery 查询条件
     * @param siteId          所属站点id
     * @return 工资条列表
     */
    List<SalaryBillDO> selectDO(SalaryBillQuery salaryBillQuery, String siteId);

    /**
     * 解析要导入的excel并返回解析结果
     *
     * @param file      文件
     * @param success   是否只返回解析成功的，如果false，则只返回失败的，为null全部返回
     * @param tokenUser 当前用户
     * @return 解析结果
     */
    List<ParseResultVO<SalaryBillImportDTO>> parseImportFile(File file, Boolean success, TokenUser tokenUser);

    /**
     * 导入excel，导入前会校验数据，如果有失败的数据则不导入
     *
     * @param file      excel
     * @param tokenUser 当前用户
     * @param force     true忽略错误的行，false有错误中断上传
     * @return 成功的条数
     */
    SalaryBillImportExcelVO importFile(File file, TokenUser tokenUser, Boolean force, String companyId, String year, String month, String tableName);

    /**
     * 保存Excel导入的工资条记录
     *
     * @param list      导入数据
     * @param tokenUser 当前用户
     * @return 员工
     */
    SalaryBillImportExcelVO saveExcelDataList(List<SalaryBillImportDTO> list, TokenUser tokenUser, String companyId, String year, String month, String tableName, Map<Integer, String> headMap);

    /**
     * 分页查询工资条及相关统计
     *
     * @param salaryBillQuery 查询条件
     * @param siteId          所属站点id
     * @return 工资条列表分页及相关统计信息
     */
    SalaryBillListRelationVO pageRelation(SalaryBillQuery salaryBillQuery, String siteId);

    /**
     * 查询工资条及相关统计
     *
     * @param salaryBillQuery 查询条件
     * @param siteId          所属站点id
     * @return 工资条列表及相关统计信息
     */
    SalaryBillListRelationVO listAllRelation(SalaryBillQuery salaryBillQuery, String siteId);

    /**
     * 查询工资条相关信息
     *
     * @param salaryBillUpdateDTO 查询条件
     * @param siteId              所属站点id
     * @return 工资条相关信息
     */
    SalaryBillVO getSalaryBillRelation(SalaryBillUpdateDTO salaryBillUpdateDTO, String siteId);

    /**
     * 月工资表生成工资条
     *
     * @param companyId        公司id
     * @param yearly           年份
     * @param monthly          月份
     * @param tableName        工资表名
     * @param salaryBillList   工资条列表
     * @param headerListString 表头列表
     * @param tokenUser        当前用户
     * @return 工资条id
     */
    String autoGenerateSalaryBill(String companyId, String yearly, String monthly, String tableName
            , List<AutoGenerateSalaryBillVO> salaryBillList, String headerListString, TokenUser tokenUser);
}


